﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace Chuong02
{
    public abstract class Camera
    {
        //  Lựa chọn vùng nhìn thấy
        private BoundingFrustum frustum;

        public BoundingFrustum Frustum
        {
            get { return frustum; }
            set { frustum = value; }
        }

        //Ma trân vIew và Projection thường xuyên thay đổi
        //Cần thiế lập lại vùng nhìn thấy khi có sự thay đổi.

        private Matrix projection;
        public Matrix Projection
        {
            get { return projection; }
            protected set
            {
                projection = value;
                generateFrustum();
            }
        }


        private Matrix view;
        public Matrix View
        {
            get { return view; }
            protected set
            {
                view = value;
                generateFrustum();
            }
        }

        //Thiết lập lại vùng nhìn thấy
        private void generateFrustum()
        {
            Matrix viewProjection = View * Projection;
            Frustum = new BoundingFrustum(viewProjection);
        }

        
        private GraphicsDevice graphicsDevice;

        public GraphicsDevice GraphicsDevice
        {
            get { return graphicsDevice; }
            set { graphicsDevice = value; }
        }

        public Camera(GraphicsDevice graphicsDevice)
        {
            this.GraphicsDevice = graphicsDevice;
            generatePerspectiveProjectionMatrix(MathHelper.PiOver4);

        }

        private void generatePerspectiveProjectionMatrix(float p)
        {
            PresentationParameters pp = GraphicsDevice.PresentationParameters;

            float aspectRadio = pp.BackBufferWidth / pp.BackBufferHeight;

            this.Projection = Matrix.CreatePerspectiveFieldOfView(p,aspectRadio,0.1f,1000000f);
        }


        //Kiểm tra sự va chạm giữa Model và vùng nhìn thấy
        public bool BoundingVolumelsInView(BoundingSphere sphere)
        {
            return (Frustum.Contains(sphere) != ContainmentType.Disjoint);
        }

        public virtual void Update()
        {

        }
    }

}
